package com.woniuxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.entity.Order;
import com.woniuxy.entity.DTO.OrderQueryDTO;
import com.woniuxy.mapper.OrderMapper;
import com.woniuxy.service.IOrderService;
import com.woniuxy.util.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Author pml
 * @Date 2025/7/16 17:43
 * @Description TODO
 * 订单服务实现类
 * 实现订单相关的业务逻辑
 * 继承ServiceImpl获得基础CRUD实现
 */
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 分页多条件查询订单列表
     * 使用MyBatis-Plus的分页插件和条件构造器实现复杂查询
     * 与UserServiceImpl中的实现逻辑保持一致，便于维护
     */
    @Override
    public PageResult<Order> getOrderList(OrderQueryDTO queryDTO) {
        // 创建分页对象，设置当前页码和每页数量
        // 使用MyBatis-Plus分页插件，自动计算总记录数和总页数
        Page<Order> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());

        // 创建查询条件构造器
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();

        // 订单号模糊查询
        // 订单号通常用于精确查询，但保留模糊查询以支持部分订单号查询场景
        if (queryDTO.getOrderSn() != null && !queryDTO.getOrderSn().isEmpty()) {
            queryWrapper.like("order_sn", queryDTO.getOrderSn());
        }

        // 用户ID精确查询
        // 用于查询指定用户的所有订单
        if (queryDTO.getUserId() != null && !queryDTO.getUserId().isEmpty()) {
            queryWrapper.eq("user_id", queryDTO.getUserId());
        }

        // 订单状态精确查询
        // 状态码与Order实体类中的定义保持一致
        if (queryDTO.getStatus() != null) {
            queryWrapper.eq("status", queryDTO.getStatus());
        }

        // 订单金额范围查询
        // 支持查询特定金额区间的订单
        if (queryDTO.getTotalAmountStart() != null) {
            queryWrapper.ge("total_amount", queryDTO.getTotalAmountStart());
        }
        if (queryDTO.getTotalAmountEnd() != null) {
            queryWrapper.le("total_amount", queryDTO.getTotalAmountEnd());
        }

        // 创建时间范围查询
        // 用于查询特定时间段内的订单
        if (queryDTO.getCreateTimeStart() != null) {
            queryWrapper.ge("create_time", queryDTO.getCreateTimeStart());
        }
        if (queryDTO.getCreateTimeEnd() != null) {
            queryWrapper.le("create_time", queryDTO.getCreateTimeEnd());
        }

        // 按创建时间降序排序
        // 最新创建的订单排在前面，符合用户习惯
        queryWrapper.orderByDesc("create_time");

        // 执行分页查询
        IPage<Order> orderPage = orderMapper.selectPage(page, queryWrapper);

        // 封装分页结果
        // 使用系统统一的PageResult格式，便于前端处理
        PageResult<Order> pageResult = new PageResult<>();
        pageResult.setPageNum(queryDTO.getPageNum());
        pageResult.setPageSize(queryDTO.getPageSize());
        pageResult.setTotal(orderPage.getTotal());
        pageResult.setPages((int) orderPage.getPages());
        pageResult.setList(orderPage.getRecords());

        return pageResult;
    }
}